#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     g_manager
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/12/14
-------------------------------------------------
   修改描述-2021/12/14:         
-------------------------------------------------
"""
import contextvars
import typing
from dataclasses import dataclass
from grpcframe.utils.singleton import Singleton
from grpcframe.exts.grpclocal.local import LocalProxy
from functools import partial


@dataclass
class GManager(metaclass=Singleton):
    # 记录当前请求的请求
    current_app_request = contextvars.ContextVar('current_app_request', default=None)
    # 记录当前请求的请求
    current_app_context = contextvars.ContextVar('current_app_context', default=None)
    # 记录当前被激活的追踪链路的span
    active_tracer_span = contextvars.ContextVar('current_active_tracer_span', default=None)
    # 包含咯当前的请求乡下问，和context上下文的对象
    current_app_request_context = contextvars.ContextVar('current_app_request_context', default=None)


_g = GManager()


def set_current_app_request(value):
    _g.current_app_request.set(value)


def get_current_app_request(_g=None):
    # 代理里面的get方法直接的返回，这样就不需要显示的调用get()
    return _g.current_app_request.get()


def set_current_app_request_context(value):
    _g.current_app_request_context.set(value)


def get_current_app_request_context(_g=None):
    # 代理里面的get方法直接的返回，这样就不需要显示的调用get()
    return _g.current_app_request_context.get()


def get_current_app_request_context2():
    # 代理里面的get方法直接的返回，这样就不需要显示的调用get()
    return _g.current_app_request_context.get()


def set_current_app_context(value):
    _g.current_app_context.set(value)


def get_current_app_context(_g=None):
    # 代理里面的get方法直接的返回，这样就不需要显示的调用get()
    return _g.current_app_context.get()


def set_active_tracer_span(value):
    _g.active_tracer_span.set(value)


def get_active_tracer_span(_g=None):
    # 代理里面的get方法直接的返回，这样就不需要显示的调用get()
    return _g.active_tracer_span.get()


# 定义 一个全局代理g里面的current_app_request 的对象，这样也可以实现类似flask上线文的效果
grequest = LocalProxy(partial(get_current_app_request, _g))
gcontext = LocalProxy(partial(get_current_app_context, _g))
gactive_tracer_span = LocalProxy(partial(get_active_tracer_span, _g))
grequestcontext = LocalProxy(partial(get_current_app_request_context, _g))

